perm filename FINDX1[1,ALS] blob
sn#508607 filedate 1980-05-10 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 FINDX1 FINDX2 FINDX3 INS1 INS1AA INS1AB INS1B INS1C FOUNDK FOUNDP INS1F INS1G INS3 INS3K INS3X INS3Y INS3Z
C00008 ENDMK
C⊗;
;FINDX1 FINDX2 FINDX3 INS1 INS1AA INS1AB INS1B INS1C FOUNDK FOUNDP INS1F INS1G INS3 INS3K INS3X INS3Y INS3Z
;Modified for 4 or 5 words per entry instead of 2 or 3
;INP file contains INPA, INPP, INPM, IMPV and INPK for boards with kings.
;and ANPA, INPP, INPM and INPV for boards without kings.
;INPM has 6 fields, 2@8 for trunk# or name, 1@8 for serial# and 2@6 for move.
;INPV has 6 fields @6 for 6 variation numbers.
;BLOWUP==↑D10 ;RELATIVE SIZE OF INPSIZ IN L AND P
;INPSIZ==↑D1024*BLOWUP ;INPSIZ=↑D1020 IN CKP
;BOKSIZ=↑D512 ;2**N FOR CONVENIENCE
;INPMAX==↑D768*BLOWUP ;MAX SIZE ALLOWED ON DMPFIL
;INPCNT: Z ;Current count of words occupied
FINDX1:
MOVEI U1,[ASCIZ /
CNT=/]
PUSHJ PDP,PRINT
MOVE U1,INPCNT
PUSHJ PDP,NUMOUT
MOVE Z,INPCNT
ADDI Z,4 ;Words per entry for non-king boards
JUMPE U4,FINDX2
ADDI Z,1 ;One more word if king board
MOVEM Z,INPCNT
TRNE Z,1
ADDI Z,5 ;To guarentee even number of entries
JRST FINDX3
FINDX2: MOVEM Z,INPCNT
TRNE Z,4
ADDI Z,4 ;To guarentee even number of entries
FINDX3: LSH Z,-1 ;Divide by 2
INS1: SETZ X1,
CAMLE U2,INPA(X1) ;Current A is in U2
POPJ PDP, ;Ahead of all present entries
CAME U2,INPA(X1)
JRST INS1AA ;BEYOND START
CAMLE U3,INPP(X1) ;Current P is in U3
POPJ PDP, ;Still want it first
CAME U3,INPP(X1)
JRST INS1AA ;BEYOND START
JUMPE U4,FOUNDP ;Duplicate is found (NON-KING CASE)
CAMLE U4,INPK(X1) ;Current K is in U4 (and ≠0)
POPJ PDP, ;Yep, first it is
CAMN U4,INPK(X1)
JRST FOUNDK ;K DUPLICATE IS FOUND
INS1AA: MOVE X1,INPCNT ;NON KING CASE, go to last entry next
SUBI X1,4
SKIPE U4 ;are there kings?
SUBI X1,1 ;KING CASE
CAMGE U2,INPA(X1)
JRST INS1G ;BEYOND END
CAME U2,INPA(X1)
JRST INS1AB ;IN RANGE
CAMGE U3,INPP(X1)
JRST INS1G ;BEYOND RANGE
CAME U3,INPP(X1)
JRST INS1AB ;IN RANGE
JUMPE U4,FOUNDP ;MOVE IS FOUND
CAMGE U4,INPK(X1)
JRST INS1G ;BEYOND RANGE
CAMN U4,INPK(X1)
JRST FOUNDK ;FOUND
INS1AB: MOVE X1,INPCNT
SUB X1,Z ;X1 is too large
INS1B: JUMPE U4,.+4
TRNE Z,1
ADDI Z,5 ;MAKE MULTIPLE OF 10
JRST .+3
TRNE Z,4
ADDI Z,4 ;Make multiple of 8
LSH Z,-1
CAMN U2,INPA(X1) ;FIND: X1|INPA(X1)>U2>INPA+1(X1)
JRST INS3 ;SIMPLE CASE
CAMG U2,INPA(X1) ;X1 TOO LARGE OR TOO SMALL?
JRST INS1F ;TOO SMALL
JRST INS3X ;TOO LARGE
INS1C: SUB X1,Z ;X1 TOO LARGE SO MAKE SMALLER
JUMPN U4,.+4
CAIGE X1,4
MOVEI X1,4
JRST INS1B
CAIGE X1,5
MOVEI X1,5
JRST INS1B
FOUNDK:
MOVEI Z,12 ;To single step for king case (Z/2 in INS1B)
SKIPA ;New move to go after recorded one
FOUNDP: MOVEI Z,10 ;To single step for non-king case
; MOVEI U1,[ASCIZ / AT FOUND /]
; PUSHJ PDP,PRINT
INS1F:
; MOVEI U1,[ASCIZ / AT INS1F /]
; PUSHJ PDP,PRINT
ADD X1,Z ;TOO SMALL, SO MAKE IT BIGGER
JUMPN U4,.+4
CAILE X1,INPCNT-4
MOVEI X1,INPCNT-4
JRST INS1B
CAILE X1,INPCNT-5
MOVEI X1,INPCNT-5
JRST INS1B
INS1G:
; MOVEI U1,[ASCIZ / AT INSIG /]
; PUSHJ PDP,PRINT
MOVE X1,INPCNT ;To go at the end
POPJ PDP,
INS3:
CAMN U3,INPP(X1)
JRST INS3K
CAMG U3,INPP(X1)
JRST INS1F ;TOO SMALL
JRST INS3X
INS3K: JUMPE U4,FOUNDP
CAMN U4,INPK(X1)
JRST FOUNDK ;BOARD IS FOUND
CAMG U4,INPK(X1)
JRST INS1F ;TOO SMALL
INS3X:
MOVE X5,INPA-4(X1) ;FOR NON-KING CASE
SKIPE U4
MOVE X5,INPA-5(X1) ;KING CASE
CAMN U2,X5
JRST INS3Y
CAMG U2,X5
POPJ PDP, ;It goes in here
JRST INS1C
INS3Y:
MOVE X5,INPP-4(X1) ;NON-KING CASE AGAIN
SKIPE U4
MOVE X5,INPP-5(X1) ;KING CASE
CAME U3,X5
JRST .+4
JUMPN U4,INS3Z
SUBI X1,4
JRST FOUNDP
CAMG U3,X5
POPJ PDP, ;IT GOES IN HERE
JRST INS1C ;TOO LARGE
INS3Z:
CAME U4,INPK-5(X1)
JRST .+3
SUBI X1,5
JRST FOUNDK
CAMG U4,INPK-5(X1)
POPJ PDP, ;It goes in here
JRST INS1C ;TOO LARGE